//构造函数
function Promise(executor){
  //为实例对象添加属性
  this.PromiseState = 'pending';
  this.PromiseResult = undefined;
  //success 
  let success = value => {
    //判断
    if(this.PromiseState !== 'pending') return;
    //改变状态
    this.PromiseState = 'fulfilled';
    //改变结果值
    this.PromiseResult = value;
  }
  //fail
  let fail = reason => {
    //判断状态是否为 pending
    if(this.PromiseState !== 'pending') return;
    //改变状态
    this.PromiseState = 'rejected';
    //改变结果值
    this.PromiseResult = reason;
  }

  try{
    //执行 执行器函数
    executor(success, fail);
  }catch(e){
    //改变 promise 实例对象的状态为失败
    fail(e);
  }
}

//原型对象中添加 then 方法
Promise.prototype.then = function(onFulfilled, onRejected){
  //判断实例对象的状态是否为成功
  if(this.PromiseState === 'fulfilled'){
    onFulfilled(this.PromiseResult);
  }
  //判断实例对象的状态是否为失败
  if(this.PromiseState === 'rejected'){
    onRejected(this.PromiseResult);
  }
}

/**
 * 1. 声明构造函数, 添加执行器函数的形参
 * 2. 添加原型上的 then 方法, 并且添加两个形参
 * 3. 执行器函数是一个同步回调, 所以在 Promise 构造函数中直接调用 executor
 * 4. 执行 executor 传入两个实参, 并声明两个函数 success 与 fail
 * 5. resolve(success) 函数的作用: 1. 改变状态  2. 改变值
 * 6. 注意 success 函数的 this 指向
 * 7. then 方法中对状态进行判断, 根据状态执行对应的回调函数即可
 */

